package com.w.usercenter.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.w.usercenter.mode.domain.User;
import com.w.usercenter.mode.request.UserLoginOrRegisterRequest;
import jakarta.servlet.http.HttpServletRequest;

import java.util.List;

/**
 * @author w
 * @description 针对表【user】的数据库操作Service
 * @createDate 2024-08-06 20:43:13
 */
public interface UserService extends IService<User> {

    /**
     * 用户注册
     *
     * @param request 请求参数
     * @return 注册的ID
     */
    long userRegister(UserLoginOrRegisterRequest request);

    /**
     * 用户登录
     *
     * @param loginRequest 请求参数
     * @param request
     * @return 登录成功的用户, 这里返回用户信息的原因是避免前端再一次的发送查询用户信息的请求.
     */
    User userLogin(UserLoginOrRegisterRequest loginRequest, HttpServletRequest request);

    /**
     * 用户注销
     *
     * @param request request
     * @return 注销成功true
     */
    boolean userLogin(HttpServletRequest request);

    /**
     * 获取当前登录用户信息
     *
     * @param request request
     * @return 登录成功的用户信息
     */
    User current(HttpServletRequest request);

    /**
     * 脱敏用户数据
     *
     * @param originUser 源用户
     * @return 脱敏后用户
     */
    User getSafetyUser(User originUser);

    /**
     * 搜索用户
     *
     * @param user 用户信息
     * @return 用户列表
     */
    List<User> searchList(User user);

    /**
     * 根据ID获取用户信息
     *
     * @param id 用户ID
     * @return 用户信息
     */
    User searchOneById(Long id);

    /**
     * 添加用户
     *
     * @param user 用户信息
     */
    boolean addUser(User user);

    /**
     * 根据ID修改用户
     *
     * @param user 用户信息
     */
    boolean editUserById(User user);


    /**
     * 删除用户
     *
     * @param ids 用户ID列表
     */
    boolean removeUserList(List<Long> ids);
    /**
     * 根据标签搜素用户 sql方式
     *
     * @param tagNameList 标签列表
     * @return 用户
     */
    List<User> searchUserByTagsOnSql(List<String> tagNameList);
    /**
     * 根据标签搜素用户 内存方式
     *
     * @param tagNameList 标签列表
     * @return 用户
     */
    List<User> searchUserByTagsOnCache(List<String> tagNameList);
}
